package com.lins.store.config.listener;

import com.lins.store.constant.UserEnum;
import com.lins.store.mapper.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.HashMap;
import java.util.Map;


/**
 * 监听session过期事件，退出用户登录
 * @Author linshuo
 * @Date 2023/1/31 17:27
 */
@Slf4j
@WebListener
public class MySessionListener implements HttpSessionListener {

    //注入方式不行
//    @Autowired
//    IUserService userService;
//
//    @Autowired
//    private UserMapper userMapper;

    public static final Map<String,HttpSession> SESSION_MAP = new HashMap<>();

    /**
     * HttpSession创建时
     * 设置当前会话失效时间，不是整个web，单位是秒，0或负数为永远不自动失效
     * 全局session失效太快，也会使验证码存储失效过快，导致验证失败。
     **/
    @Override
    public void sessionCreated(HttpSessionEvent se) {

        HttpSession session = se.getSession();
        //设置当前会话时间，应该在各自会话那里设置(使用session时)，不应该是在此处全局给每一个新建的会话设置同样的时间。
//        session.setMaxInactiveInterval(60);
        SESSION_MAP.put(session.getId(),session);
    }

    /**
     * HttpSession销毁时
     **/
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        //session销毁时，改变用户状态
        HttpSession session = se.getSession();
        Object uid = session.getAttribute("uid");
        Object name = session.getAttribute("username");

//        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//        IUserService userService = (IUserService) context.getBean("userService");

        WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(session.getServletContext());
        UserMapper userMapper = (UserMapper) context.getBean("userMapper");
        //修改结果
        Integer i = 0;
        //若用户状态不是 已删除状态2，则改为离线状态0
        if (userMapper.findByUid(uid.toString()).getState() != UserEnum.USER_DELETED){
            i = userMapper.changeUserState((Integer) uid, UserEnum.OFF_LINE);
        }
        log.info("用户{}退出登录，用户状态更新成功{}条",name,i);

        SESSION_MAP.remove(session.getId());
    }
}
